package main
import (
    "fmt"
    "log"
	"net" //支持通讯的包
	"github.com/Unknwon/goconfig"
	"time"
)

var conn_count int

//开始服务器
func startServer() {

	cfg, err := goconfig.LoadConfigFile("conf.ini")
	if err != nil{
		fmt.Println(time.Now().String()+"读取配置文件错误")
	}
	tcpurl, err := cfg.GetValue("net", "tcpurl")
    //连接主机、端口，采用ｔｃｐ方式通信，监听７７７７端口
    listener, err := net.Listen("tcp", tcpurl)
    checkError(err)
    fmt.Println("["+time.Now().Format("2006-01-02 15:04:05")+"] 建立成功,当前监听端口"+tcpurl)
    for {
		
        //等待客户端接入
        conn, err := listener.Accept()
		checkConnError(err,conn)
		conn_count++;
        fmt.Println("["+time.Now().Format("2006-01-02 15:04:05")+"] 用户"+conn.RemoteAddr().String()+"连接成功,当前连接",conn_count,"个客户端");
        //开一个goroutines处理客户端消息，这是golang的特色，实现并发就只go一下就好
        go doServerStuff(conn)
    }
}

//处理客户端消息
func doServerStuff(conn net.Conn) {
    for {
        buf := make([]byte, 64)
        _, err := conn.Read(buf) //读取客户机发的消息
        flag := checkConnError(err,conn)
        if flag == 0 {
            break
        }
		fmt.Println("["+time.Now().Format("2006-01-02 15:04:05")+"] 来自客户端"+conn.RemoteAddr().String()+"的消息:"+string(buf)) //打印出来
		//break;
		//_, err = conn.Write([]byte("123456")) //读取客户机发的消息
        //flag = checkError(err)
        //if flag == 0 {
		//	fmt.Println(conn)
        //    break
       // }
    }
}

//检查错误
func checkError(err error) int {
    if err != nil {
        if err.Error() == "EOF" {
            fmt.Println("用户退出了")
            return 0
        }
        log.Fatal("an error!", err.Error())
        return -1
    }
    return 1
}

//检查错误
func checkConnError(err error,conn net.Conn) int {
    if err != nil {
        if err.Error() == "EOF" {
			conn_count--;
            fmt.Println("["+time.Now().Format("2006-01-02 15:04:05")+"] 用户"+conn.RemoteAddr().String()+"断开连接,当前连接",conn_count,"个客户端")
            return 0
        }
        log.Fatal("an error!", err.Error())
        return -1
    }
    return 1
}


func main() {
    //开启服务
  //  opend, db := OpenDB()
  //  if opend {
   //     fmt.Println("open success")
   // } else {
   //     fmt.Println("open faile:")
   // }
    //db.Close()
    startServer()
}